#!/bin/bash

# Web Notes 应用一键部署脚本
# 用法: ./deploy.sh

set -e  # 遇到错误立即退出

echo "🚀 开始部署 Web Notes 应用..."

# 颜色定义
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
NC='\033[0m' # No Color

# 配置变量
APP_DIR="/var/www/web-notes"
BACKEND_DIR="$APP_DIR/web-notes-backend"
FRONTEND_DIR="$APP_DIR/web-notes-frontend"
NGINX_CONFIG="/etc/nginx/conf.d/web-notes.conf"
PM2_CONFIG="$APP_DIR/ecosystem.config.json"

# 检查是否为 root 用户
check_root() {
    if [[ $EUID -eq 0 ]]; then
        echo -e "${RED}请不要使用 root 用户运行此脚本${NC}"
        exit 1
    fi
}

# 检查系统
check_system() {
    echo -e "${YELLOW}检查系统环境...${NC}"
    
    if ! command -v node &> /dev/null; then
        echo -e "${RED}Node.js 未安装，请先安装 Node.js 18+${NC}"
        exit 1
    fi
    
    if ! command -v npm &> /dev/null; then
        echo -e "${RED}npm 未安装${NC}"
        exit 1
    fi
    
    if ! command -v nginx &> /dev/null; then
        echo -e "${RED}Nginx 未安装${NC}"
        exit 1
    fi
    
    if ! command -v pm2 &> /dev/null; then
        echo -e "${RED}PM2 未安装，正在安装...${NC}"
        sudo npm install -g pm2
    fi
    
    if ! systemctl is-active --quiet mongod; then
        echo -e "${RED}MongoDB 未运行，请启动 MongoDB${NC}"
        exit 1
    fi
    
    echo -e "${GREEN}系统环境检查通过${NC}"
}

# 创建目录结构
create_directories() {
    echo -e "${YELLOW}创建目录结构...${NC}"
    
    sudo mkdir -p $APP_DIR
    sudo chown $USER:$USER $APP_DIR
    mkdir -p $APP_DIR/logs
}

# 安装后端
install_backend() {
    echo -e "${YELLOW}安装后端应用...${NC}"
    
    cd $BACKEND_DIR
    
    # 先安装所有依赖 (包括 devDependencies 用于构建)
    npm install
    
    # 构建应用
    npm run build
    
    # 构建完成后清理 devDependencies (可选，节省空间)
    # npm prune --production
    
    # 创建环境配置
    if [ ! -f .env ]; then
        cp .env.production .env
        echo -e "${YELLOW}请编辑 $BACKEND_DIR/.env 文件配置生产环境参数${NC}"
    fi
    
    # 创建上传目录
    mkdir -p uploads/images
    
    echo -e "${GREEN}后端安装完成${NC}"
}

# 构建前端
build_frontend() {
    echo -e "${YELLOW}构建前端应用...${NC}"
    
    cd $FRONTEND_DIR
    
    # 安装依赖
    npm install
    
    # 构建生产版本
    npm run build
    
    echo -e "${GREEN}前端构建完成${NC}"
}

# 配置 Nginx
configure_nginx() {
    echo -e "${YELLOW}配置 Nginx...${NC}"
    
    # 复制配置文件
    sudo cp nginx-config/web-notes.conf $NGINX_CONFIG
    
    # 测试配置
    sudo nginx -t
    
    # 重启 Nginx
    sudo systemctl restart nginx
    
    echo -e "${GREEN}Nginx 配置完成${NC}"
}

# 配置 PM2
configure_pm2() {
    echo -e "${YELLOW}配置 PM2...${NC}"
    
    # 停止可能存在的进程
    pm2 delete web-notes-api 2>/dev/null || true
    
    # 复制配置文件
    cp pm2-config/ecosystem.config.json $PM2_CONFIG
    
    # 启动应用
    pm2 start $PM2_CONFIG
    
    # 保存 PM2 配置
    pm2 save
    
    # 设置开机自启 (如果还未设置)
    pm2 startup 2>/dev/null || true
    
    echo -e "${GREEN}PM2 配置完成${NC}"
}

# 设置防火墙
configure_firewall() {
    echo -e "${YELLOW}配置防火墙...${NC}"
    
    if systemctl is-active --quiet firewalld; then
        sudo firewall-cmd --permanent --add-port=80/tcp
        sudo firewall-cmd --permanent --add-port=443/tcp
        sudo firewall-cmd --reload
        echo -e "${GREEN}防火墙配置完成${NC}"
    else
        echo -e "${YELLOW}防火墙未启用，跳过配置${NC}"
    fi
}

# 检查服务状态
check_services() {
    echo -e "${YELLOW}检查服务状态...${NC}"
    
    echo "MongoDB 状态:"
    systemctl status mongod --no-pager -l
    
    echo -e "\nNginx 状态:"
    systemctl status nginx --no-pager -l
    
    echo -e "\nPM2 应用状态:"
    pm2 status
    
    echo -e "\n应用日志 (最近10行):"
    pm2 logs web-notes-api --lines 10 --nostream
}

# 显示完成信息
show_completion_info() {
    echo -e "\n${GREEN}🎉 部署完成!${NC}"
    echo -e "\n访问信息:"
    echo -e "应用地址: ${GREEN}http://$(hostname -I | awk '{print $1}')${NC}"
    echo -e "API 地址: ${GREEN}http://$(hostname -I | awk '{print $1}')/api${NC}"
    
    echo -e "\n常用命令:"
    echo -e "查看应用状态: ${YELLOW}pm2 status${NC}"
    echo -e "查看应用日志: ${YELLOW}pm2 logs web-notes-api${NC}"
    echo -e "重启应用: ${YELLOW}pm2 restart web-notes-api${NC}"
    echo -e "重启 Nginx: ${YELLOW}sudo systemctl restart nginx${NC}"
    
    echo -e "\n配置文件位置:"
    echo -e "后端环境配置: ${YELLOW}$BACKEND_DIR/.env${NC}"
    echo -e "Nginx 配置: ${YELLOW}$NGINX_CONFIG${NC}"
    echo -e "PM2 配置: ${YELLOW}$PM2_CONFIG${NC}"
    
    echo -e "\n${YELLOW}请确保：${NC}"
    echo -e "1. 编辑 $BACKEND_DIR/.env 文件配置数据库连接和 JWT 密钥"
    echo -e "2. 更新 Nginx 配置中的域名 (如果使用域名)"
    echo -e "3. 配置 SSL 证书 (推荐)"
}

# 主函数
main() {
    check_root
    check_system
    create_directories
    install_backend
    build_frontend
    configure_nginx
    configure_pm2
    configure_firewall
    check_services
    show_completion_info
}

# 运行主函数
main "$@"